<!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
        <title>opengauss-hnsw</title>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.5.0/Chart.js"></script>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
        <!-- Include all compiled plugins (below), or include individual files as needed -->
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
        <!-- Bootstrap -->
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
        <style>
            body { padding-top: 50px; }
        </style>
        <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
        <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
        <!--[if lt IE 9]>
          <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
          <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
        <![endif]-->
      </head>
         <body>

            <nav class="navbar navbar-inverse navbar-fixed-top">
              <div class="container">
                <div class="navbar-header">
                  <a class="navbar-brand" href="index.html">ANN Benchmarks</a>
                </div>
                <div id="navbar" class="collapse navbar-collapse">
                  <ul class="nav navbar-nav">
                    <li class="active"><a href="index.html">Home</a></li>
                  </ul>
                  <ul class="nav navbar-nav">
                    <li class="active"><a href="index.html#datasets">Datasets</a></li>
                  </ul>
                  <ul class="nav navbar-nav">
                    <li class="active"><a href="index.html#algorithms">Algorithms</a></li>
                  </ul>
                  <ul class="nav navbar-nav">
                    <li class="active"><a href="index.html#contact">Contact</a></li>
                  </ul>
                </div><!--/.nav-collapse -->
              </div>
            </nav>

                    <div class="container">
                                                        <h2>Plots for opengauss-hnsw</h2>
                                                                <h3>Recall/Queries per second (1/s)</h3>
            <div id="RecallQueries per second (1/s)">
            <canvas id="chartRecallQueries per second (1/s)" width="800" height="600"></canvas>
            <script>
                var ctx = document.getElementById("chartRecallQueries per second (1/s)");
                var chart = new Chart(ctx, {
                                        type: "line",
                                        data: { datasets: [
                                                {
                            label: "sift-128-euclidean (k = 10)",
                            fill: false,
                            pointStyle: "rect",
                            borderColor: "rgba(229, 102, 102, 1)",
                            data: [
                                                                    { x: 1.0 , y: 462.97301175561563, label: "OpenGaussHnswVector(m=16, ef_construction=200, hnsw_ef_search=80)" },
                                                            ]
                        },
                                                ]},
                        options: {
                            responsive: false,
                            title:{
                                display:true,
                                text: 'Recall-Queries per second (1/s) tradeoff - up and to the right is better'
                            },
                            scales: {
                                xAxes: [{
                                    display: true,
                                    type: 'linear',
                                    max: '1',
                                    position: 'bottom',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Recall   '
                                    }
                                }],
                                yAxes: [{
                                    display: true,
                                    type: 'logarithmic',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Queries per second (1/s) '
                                    }
                                }]
                            }
                        }
                    });
                function pushOrConcat(base, toPush) {
                        if (toPush) {
                                if (Chart.helpers.isArray(toPush)) {
                                        // base = base.concat(toPush);
                                        Array.prototype.push.apply(base, toPush);
                                } else {
                                        base.push(toPush);
                                }
                        }

                        return base;
                }
                Chart.Tooltip.prototype.getFooter = function(tooltipItem, data) {
                    var me = this;
                    var callbacks = me._options.callbacks;
                    var item = tooltipItem[0];

                    var beforeFooter = callbacks.beforeFooter.apply(me, arguments);
                    var footer = "Parameters: " + data.datasets[item.datasetIndex].data[item.index].label || '';
                    var afterFooter = callbacks.afterFooter.apply(me, arguments);

                    var lines = [];
                    lines = pushOrConcat(lines, beforeFooter);
                    lines = pushOrConcat(lines, footer);
                    lines = pushOrConcat(lines, afterFooter);

                    return lines;
                }

                </script>
            </div>
            
                                    <h3>Recall/Build time (s)</h3>
            <div id="RecallBuild time (s)">
            <canvas id="chartRecallBuild time (s)" width="800" height="600"></canvas>
            <script>
                var ctx = document.getElementById("chartRecallBuild time (s)");
                var chart = new Chart(ctx, {
                                        type: "line",
                                        data: { datasets: [
                                                {
                            label: "sift-128-euclidean (k = 10)",
                            fill: false,
                            pointStyle: "rect",
                            borderColor: "rgba(229, 102, 102, 1)",
                            data: [
                                                                    { x: 1.0 , y: 2.095747232437134, label: "OpenGaussHnswVector(m=16, ef_construction=200, hnsw_ef_search=800)" },
                                                            ]
                        },
                                                ]},
                        options: {
                            responsive: false,
                            title:{
                                display:true,
                                text: 'Recall-Build time (s) tradeoff - down and to the right is better'
                            },
                            scales: {
                                xAxes: [{
                                    display: true,
                                    type: 'linear',
                                    max: '1',
                                    position: 'bottom',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Recall   '
                                    }
                                }],
                                yAxes: [{
                                    display: true,
                                    type: 'logarithmic',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Build time (s) '
                                    }
                                }]
                            }
                        }
                    });
                function pushOrConcat(base, toPush) {
                        if (toPush) {
                                if (Chart.helpers.isArray(toPush)) {
                                        // base = base.concat(toPush);
                                        Array.prototype.push.apply(base, toPush);
                                } else {
                                        base.push(toPush);
                                }
                        }

                        return base;
                }
                Chart.Tooltip.prototype.getFooter = function(tooltipItem, data) {
                    var me = this;
                    var callbacks = me._options.callbacks;
                    var item = tooltipItem[0];

                    var beforeFooter = callbacks.beforeFooter.apply(me, arguments);
                    var footer = "Parameters: " + data.datasets[item.datasetIndex].data[item.index].label || '';
                    var afterFooter = callbacks.afterFooter.apply(me, arguments);

                    var lines = [];
                    lines = pushOrConcat(lines, beforeFooter);
                    lines = pushOrConcat(lines, footer);
                    lines = pushOrConcat(lines, afterFooter);

                    return lines;
                }

                </script>
            </div>
            
                                    <h3>Recall/Index size (kB)</h3>
            <div id="RecallIndex size (kB)">
            <canvas id="chartRecallIndex size (kB)" width="800" height="600"></canvas>
            <script>
                var ctx = document.getElementById("chartRecallIndex size (kB)");
                var chart = new Chart(ctx, {
                                        type: "line",
                                        data: { datasets: [
                                                {
                            label: "sift-128-euclidean (k = 10)",
                            fill: false,
                            pointStyle: "rect",
                            borderColor: "rgba(229, 102, 102, 1)",
                            data: [
                                                                    { x: 1.0 , y: 8136.0, label: "OpenGaussHnswVector(m=16, ef_construction=200, hnsw_ef_search=800)" },
                                                            ]
                        },
                                                ]},
                        options: {
                            responsive: false,
                            title:{
                                display:true,
                                text: 'Recall-Index size (kB) tradeoff - down and to the right is better'
                            },
                            scales: {
                                xAxes: [{
                                    display: true,
                                    type: 'linear',
                                    max: '1',
                                    position: 'bottom',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Recall   '
                                    }
                                }],
                                yAxes: [{
                                    display: true,
                                    type: 'logarithmic',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Index size (kB) '
                                    }
                                }]
                            }
                        }
                    });
                function pushOrConcat(base, toPush) {
                        if (toPush) {
                                if (Chart.helpers.isArray(toPush)) {
                                        // base = base.concat(toPush);
                                        Array.prototype.push.apply(base, toPush);
                                } else {
                                        base.push(toPush);
                                }
                        }

                        return base;
                }
                Chart.Tooltip.prototype.getFooter = function(tooltipItem, data) {
                    var me = this;
                    var callbacks = me._options.callbacks;
                    var item = tooltipItem[0];

                    var beforeFooter = callbacks.beforeFooter.apply(me, arguments);
                    var footer = "Parameters: " + data.datasets[item.datasetIndex].data[item.index].label || '';
                    var afterFooter = callbacks.afterFooter.apply(me, arguments);

                    var lines = [];
                    lines = pushOrConcat(lines, beforeFooter);
                    lines = pushOrConcat(lines, footer);
                    lines = pushOrConcat(lines, afterFooter);

                    return lines;
                }

                </script>
            </div>
            
                                    <h3>Recall/Distance computations</h3>
            <div id="RecallDistance computations">
            <canvas id="chartRecallDistance computations" width="800" height="600"></canvas>
            <script>
                var ctx = document.getElementById("chartRecallDistance computations");
                var chart = new Chart(ctx, {
                                        type: "line",
                                        data: { datasets: [
                                                {
                            label: "sift-128-euclidean (k = 10)",
                            fill: false,
                            pointStyle: "rect",
                            borderColor: "rgba(229, 102, 102, 1)",
                            data: [
                                                            ]
                        },
                                                ]},
                        options: {
                            responsive: false,
                            title:{
                                display:true,
                                text: 'Recall-Distance computations tradeoff - down and to the right is better'
                            },
                            scales: {
                                xAxes: [{
                                    display: true,
                                    type: 'linear',
                                    max: '1',
                                    position: 'bottom',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Recall   '
                                    }
                                }],
                                yAxes: [{
                                    display: true,
                                    type: 'logarithmic',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Distance computations '
                                    }
                                }]
                            }
                        }
                    });
                function pushOrConcat(base, toPush) {
                        if (toPush) {
                                if (Chart.helpers.isArray(toPush)) {
                                        // base = base.concat(toPush);
                                        Array.prototype.push.apply(base, toPush);
                                } else {
                                        base.push(toPush);
                                }
                        }

                        return base;
                }
                Chart.Tooltip.prototype.getFooter = function(tooltipItem, data) {
                    var me = this;
                    var callbacks = me._options.callbacks;
                    var item = tooltipItem[0];

                    var beforeFooter = callbacks.beforeFooter.apply(me, arguments);
                    var footer = "Parameters: " + data.datasets[item.datasetIndex].data[item.index].label || '';
                    var afterFooter = callbacks.afterFooter.apply(me, arguments);

                    var lines = [];
                    lines = pushOrConcat(lines, beforeFooter);
                    lines = pushOrConcat(lines, footer);
                    lines = pushOrConcat(lines, afterFooter);

                    return lines;
                }

                </script>
            </div>
            
                                    <h3>Relative Error/Queries per second (1/s)</h3>
            <div id="Relative ErrorQueries per second (1/s)">
            <canvas id="chartRelative ErrorQueries per second (1/s)" width="800" height="600"></canvas>
            <script>
                var ctx = document.getElementById("chartRelative ErrorQueries per second (1/s)");
                var chart = new Chart(ctx, {
                                        type: "line",
                                        data: { datasets: [
                                                {
                            label: "sift-128-euclidean (k = 10)",
                            fill: false,
                            pointStyle: "rect",
                            borderColor: "rgba(229, 102, 102, 1)",
                            data: [
                                                                    { x: 0.08350007294358446 , y: 462.97301175561563, label: "OpenGaussHnswVector(m=16, ef_construction=200, hnsw_ef_search=80)" },
                                                            ]
                        },
                                                ]},
                        options: {
                            responsive: false,
                            title:{
                                display:true,
                                text: 'Relative Error-Queries per second (1/s) tradeoff - up and to the left is better'
                            },
                            scales: {
                                xAxes: [{
                                    display: true,
                                    type: 'linear',
                                    max: '1',
                                    position: 'bottom',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Relative Error   '
                                    }
                                }],
                                yAxes: [{
                                    display: true,
                                    type: 'logarithmic',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Queries per second (1/s) '
                                    }
                                }]
                            }
                        }
                    });
                function pushOrConcat(base, toPush) {
                        if (toPush) {
                                if (Chart.helpers.isArray(toPush)) {
                                        // base = base.concat(toPush);
                                        Array.prototype.push.apply(base, toPush);
                                } else {
                                        base.push(toPush);
                                }
                        }

                        return base;
                }
                Chart.Tooltip.prototype.getFooter = function(tooltipItem, data) {
                    var me = this;
                    var callbacks = me._options.callbacks;
                    var item = tooltipItem[0];

                    var beforeFooter = callbacks.beforeFooter.apply(me, arguments);
                    var footer = "Parameters: " + data.datasets[item.datasetIndex].data[item.index].label || '';
                    var afterFooter = callbacks.afterFooter.apply(me, arguments);

                    var lines = [];
                    lines = pushOrConcat(lines, beforeFooter);
                    lines = pushOrConcat(lines, footer);
                    lines = pushOrConcat(lines, afterFooter);

                    return lines;
                }

                </script>
            </div>
            
                                    <h3>Recall/Candidates generated</h3>
            <div id="RecallCandidates generated">
            <canvas id="chartRecallCandidates generated" width="800" height="600"></canvas>
            <script>
                var ctx = document.getElementById("chartRecallCandidates generated");
                var chart = new Chart(ctx, {
                                        type: "line",
                                        data: { datasets: [
                                                {
                            label: "sift-128-euclidean (k = 10)",
                            fill: false,
                            pointStyle: "rect",
                            borderColor: "rgba(229, 102, 102, 1)",
                            data: [
                                                                    { x: 1.0 , y: 10.0, label: "OpenGaussHnswVector(m=32, ef_construction=200, hnsw_ef_search=800)" },
                                                            ]
                        },
                                                ]},
                        options: {
                            responsive: false,
                            title:{
                                display:true,
                                text: 'Recall-Candidates generated tradeoff - down and to the right is better'
                            },
                            scales: {
                                xAxes: [{
                                    display: true,
                                    type: 'linear',
                                    max: '1',
                                    position: 'bottom',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Recall   '
                                    }
                                }],
                                yAxes: [{
                                    display: true,
                                    type: 'logarithmic',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Candidates generated '
                                    }
                                }]
                            }
                        }
                    });
                function pushOrConcat(base, toPush) {
                        if (toPush) {
                                if (Chart.helpers.isArray(toPush)) {
                                        // base = base.concat(toPush);
                                        Array.prototype.push.apply(base, toPush);
                                } else {
                                        base.push(toPush);
                                }
                        }

                        return base;
                }
                Chart.Tooltip.prototype.getFooter = function(tooltipItem, data) {
                    var me = this;
                    var callbacks = me._options.callbacks;
                    var item = tooltipItem[0];

                    var beforeFooter = callbacks.beforeFooter.apply(me, arguments);
                    var footer = "Parameters: " + data.datasets[item.datasetIndex].data[item.index].label || '';
                    var afterFooter = callbacks.afterFooter.apply(me, arguments);

                    var lines = [];
                    lines = pushOrConcat(lines, beforeFooter);
                    lines = pushOrConcat(lines, footer);
                    lines = pushOrConcat(lines, afterFooter);

                    return lines;
                }

                </script>
            </div>
            
                                    <h3>Recall/Index size (kB)/Queries per second (s)</h3>
            <div id="RecallIndex size (kB)/Queries per second (s)">
            <canvas id="chartRecallIndex size (kB)/Queries per second (s)" width="800" height="600"></canvas>
            <script>
                var ctx = document.getElementById("chartRecallIndex size (kB)/Queries per second (s)");
                var chart = new Chart(ctx, {
                                        type: "line",
                                        data: { datasets: [
                                                {
                            label: "sift-128-euclidean (k = 10)",
                            fill: false,
                            pointStyle: "rect",
                            borderColor: "rgba(229, 102, 102, 1)",
                            data: [
                                                                    { x: 1.0 , y: 17.573378562927246, label: "OpenGaussHnswVector(m=16, ef_construction=200, hnsw_ef_search=80)" },
                                                            ]
                        },
                                                ]},
                        options: {
                            responsive: false,
                            title:{
                                display:true,
                                text: 'Recall-Index size (kB)/Queries per second (s) tradeoff - down and to the right is better'
                            },
                            scales: {
                                xAxes: [{
                                    display: true,
                                    type: 'linear',
                                    max: '1',
                                    position: 'bottom',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Recall   '
                                    }
                                }],
                                yAxes: [{
                                    display: true,
                                    type: 'logarithmic',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Index size (kB)/Queries per second (s) '
                                    }
                                }]
                            }
                        }
                    });
                function pushOrConcat(base, toPush) {
                        if (toPush) {
                                if (Chart.helpers.isArray(toPush)) {
                                        // base = base.concat(toPush);
                                        Array.prototype.push.apply(base, toPush);
                                } else {
                                        base.push(toPush);
                                }
                        }

                        return base;
                }
                Chart.Tooltip.prototype.getFooter = function(tooltipItem, data) {
                    var me = this;
                    var callbacks = me._options.callbacks;
                    var item = tooltipItem[0];

                    var beforeFooter = callbacks.beforeFooter.apply(me, arguments);
                    var footer = "Parameters: " + data.datasets[item.datasetIndex].data[item.index].label || '';
                    var afterFooter = callbacks.afterFooter.apply(me, arguments);

                    var lines = [];
                    lines = pushOrConcat(lines, beforeFooter);
                    lines = pushOrConcat(lines, footer);
                    lines = pushOrConcat(lines, afterFooter);

                    return lines;
                }

                </script>
            </div>
            
                                    <h3>Epsilon 0.01 Recall/Queries per second (1/s)</h3>
            <div id="Epsilon 0.01 RecallQueries per second (1/s)">
            <canvas id="chartEpsilon 0.01 RecallQueries per second (1/s)" width="800" height="600"></canvas>
            <script>
                var ctx = document.getElementById("chartEpsilon 0.01 RecallQueries per second (1/s)");
                var chart = new Chart(ctx, {
                                        type: "line",
                                        data: { datasets: [
                                                {
                            label: "sift-128-euclidean (k = 10)",
                            fill: false,
                            pointStyle: "rect",
                            borderColor: "rgba(229, 102, 102, 1)",
                            data: [
                                                                    { x: 1.0 , y: 462.97301175561563, label: "OpenGaussHnswVector(m=16, ef_construction=200, hnsw_ef_search=80)" },
                                                            ]
                        },
                                                ]},
                        options: {
                            responsive: false,
                            title:{
                                display:true,
                                text: 'Epsilon 0.01 Recall-Queries per second (1/s) tradeoff - up and to the right is better'
                            },
                            scales: {
                                xAxes: [{
                                    display: true,
                                    type: 'linear',
                                    max: '1',
                                    position: 'bottom',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Epsilon 0.01 Recall   '
                                    }
                                }],
                                yAxes: [{
                                    display: true,
                                    type: 'logarithmic',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Queries per second (1/s) '
                                    }
                                }]
                            }
                        }
                    });
                function pushOrConcat(base, toPush) {
                        if (toPush) {
                                if (Chart.helpers.isArray(toPush)) {
                                        // base = base.concat(toPush);
                                        Array.prototype.push.apply(base, toPush);
                                } else {
                                        base.push(toPush);
                                }
                        }

                        return base;
                }
                Chart.Tooltip.prototype.getFooter = function(tooltipItem, data) {
                    var me = this;
                    var callbacks = me._options.callbacks;
                    var item = tooltipItem[0];

                    var beforeFooter = callbacks.beforeFooter.apply(me, arguments);
                    var footer = "Parameters: " + data.datasets[item.datasetIndex].data[item.index].label || '';
                    var afterFooter = callbacks.afterFooter.apply(me, arguments);

                    var lines = [];
                    lines = pushOrConcat(lines, beforeFooter);
                    lines = pushOrConcat(lines, footer);
                    lines = pushOrConcat(lines, afterFooter);

                    return lines;
                }

                </script>
            </div>
            
                                    <h3>Epsilon 0.1 Recall/Queries per second (1/s)</h3>
            <div id="Epsilon 0.1 RecallQueries per second (1/s)">
            <canvas id="chartEpsilon 0.1 RecallQueries per second (1/s)" width="800" height="600"></canvas>
            <script>
                var ctx = document.getElementById("chartEpsilon 0.1 RecallQueries per second (1/s)");
                var chart = new Chart(ctx, {
                                        type: "line",
                                        data: { datasets: [
                                                {
                            label: "sift-128-euclidean (k = 10)",
                            fill: false,
                            pointStyle: "rect",
                            borderColor: "rgba(229, 102, 102, 1)",
                            data: [
                                                                    { x: 1.0 , y: 462.97301175561563, label: "OpenGaussHnswVector(m=16, ef_construction=200, hnsw_ef_search=80)" },
                                                            ]
                        },
                                                ]},
                        options: {
                            responsive: false,
                            title:{
                                display:true,
                                text: 'Epsilon 0.1 Recall-Queries per second (1/s) tradeoff - up and to the right is better'
                            },
                            scales: {
                                xAxes: [{
                                    display: true,
                                    type: 'linear',
                                    max: '1',
                                    position: 'bottom',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Epsilon 0.1 Recall   '
                                    }
                                }],
                                yAxes: [{
                                    display: true,
                                    type: 'logarithmic',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Queries per second (1/s) '
                                    }
                                }]
                            }
                        }
                    });
                function pushOrConcat(base, toPush) {
                        if (toPush) {
                                if (Chart.helpers.isArray(toPush)) {
                                        // base = base.concat(toPush);
                                        Array.prototype.push.apply(base, toPush);
                                } else {
                                        base.push(toPush);
                                }
                        }

                        return base;
                }
                Chart.Tooltip.prototype.getFooter = function(tooltipItem, data) {
                    var me = this;
                    var callbacks = me._options.callbacks;
                    var item = tooltipItem[0];

                    var beforeFooter = callbacks.beforeFooter.apply(me, arguments);
                    var footer = "Parameters: " + data.datasets[item.datasetIndex].data[item.index].label || '';
                    var afterFooter = callbacks.afterFooter.apply(me, arguments);

                    var lines = [];
                    lines = pushOrConcat(lines, beforeFooter);
                    lines = pushOrConcat(lines, footer);
                    lines = pushOrConcat(lines, afterFooter);

                    return lines;
                }

                </script>
            </div>
            
                                    <h3>Recall/Percentile 50 (millis)</h3>
            <div id="RecallPercentile 50 (millis)">
            <canvas id="chartRecallPercentile 50 (millis)" width="800" height="600"></canvas>
            <script>
                var ctx = document.getElementById("chartRecallPercentile 50 (millis)");
                var chart = new Chart(ctx, {
                                        type: "line",
                                        data: { datasets: [
                                                {
                            label: "sift-128-euclidean (k = 10)",
                            fill: false,
                            pointStyle: "rect",
                            borderColor: "rgba(229, 102, 102, 1)",
                            data: [
                                                                    { x: 1.0 , y: 2.106785774230957, label: "OpenGaussHnswVector(m=16, ef_construction=200, hnsw_ef_search=80)" },
                                                            ]
                        },
                                                ]},
                        options: {
                            responsive: false,
                            title:{
                                display:true,
                                text: 'Recall-Percentile 50 (millis) tradeoff - down and to the right is better'
                            },
                            scales: {
                                xAxes: [{
                                    display: true,
                                    type: 'linear',
                                    max: '1',
                                    position: 'bottom',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Recall   '
                                    }
                                }],
                                yAxes: [{
                                    display: true,
                                    type: 'logarithmic',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Percentile 50 (millis) '
                                    }
                                }]
                            }
                        }
                    });
                function pushOrConcat(base, toPush) {
                        if (toPush) {
                                if (Chart.helpers.isArray(toPush)) {
                                        // base = base.concat(toPush);
                                        Array.prototype.push.apply(base, toPush);
                                } else {
                                        base.push(toPush);
                                }
                        }

                        return base;
                }
                Chart.Tooltip.prototype.getFooter = function(tooltipItem, data) {
                    var me = this;
                    var callbacks = me._options.callbacks;
                    var item = tooltipItem[0];

                    var beforeFooter = callbacks.beforeFooter.apply(me, arguments);
                    var footer = "Parameters: " + data.datasets[item.datasetIndex].data[item.index].label || '';
                    var afterFooter = callbacks.afterFooter.apply(me, arguments);

                    var lines = [];
                    lines = pushOrConcat(lines, beforeFooter);
                    lines = pushOrConcat(lines, footer);
                    lines = pushOrConcat(lines, afterFooter);

                    return lines;
                }

                </script>
            </div>
            
                                    <h3>Recall/Percentile 95 (millis)</h3>
            <div id="RecallPercentile 95 (millis)">
            <canvas id="chartRecallPercentile 95 (millis)" width="800" height="600"></canvas>
            <script>
                var ctx = document.getElementById("chartRecallPercentile 95 (millis)");
                var chart = new Chart(ctx, {
                                        type: "line",
                                        data: { datasets: [
                                                {
                            label: "sift-128-euclidean (k = 10)",
                            fill: false,
                            pointStyle: "rect",
                            borderColor: "rgba(229, 102, 102, 1)",
                            data: [
                                                                    { x: 1.0 , y: 2.8534173965454097, label: "OpenGaussHnswVector(m=16, ef_construction=200, hnsw_ef_search=80)" },
                                                            ]
                        },
                                                ]},
                        options: {
                            responsive: false,
                            title:{
                                display:true,
                                text: 'Recall-Percentile 95 (millis) tradeoff - down and to the right is better'
                            },
                            scales: {
                                xAxes: [{
                                    display: true,
                                    type: 'linear',
                                    max: '1',
                                    position: 'bottom',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Recall   '
                                    }
                                }],
                                yAxes: [{
                                    display: true,
                                    type: 'logarithmic',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Percentile 95 (millis) '
                                    }
                                }]
                            }
                        }
                    });
                function pushOrConcat(base, toPush) {
                        if (toPush) {
                                if (Chart.helpers.isArray(toPush)) {
                                        // base = base.concat(toPush);
                                        Array.prototype.push.apply(base, toPush);
                                } else {
                                        base.push(toPush);
                                }
                        }

                        return base;
                }
                Chart.Tooltip.prototype.getFooter = function(tooltipItem, data) {
                    var me = this;
                    var callbacks = me._options.callbacks;
                    var item = tooltipItem[0];

                    var beforeFooter = callbacks.beforeFooter.apply(me, arguments);
                    var footer = "Parameters: " + data.datasets[item.datasetIndex].data[item.index].label || '';
                    var afterFooter = callbacks.afterFooter.apply(me, arguments);

                    var lines = [];
                    lines = pushOrConcat(lines, beforeFooter);
                    lines = pushOrConcat(lines, footer);
                    lines = pushOrConcat(lines, afterFooter);

                    return lines;
                }

                </script>
            </div>
            
                                    <h3>Recall/Percentile 99 (millis)</h3>
            <div id="RecallPercentile 99 (millis)">
            <canvas id="chartRecallPercentile 99 (millis)" width="800" height="600"></canvas>
            <script>
                var ctx = document.getElementById("chartRecallPercentile 99 (millis)");
                var chart = new Chart(ctx, {
                                        type: "line",
                                        data: { datasets: [
                                                {
                            label: "sift-128-euclidean (k = 10)",
                            fill: false,
                            pointStyle: "rect",
                            borderColor: "rgba(229, 102, 102, 1)",
                            data: [
                                                                    { x: 1.0 , y: 3.789520263671876, label: "OpenGaussHnswVector(m=16, ef_construction=200, hnsw_ef_search=80)" },
                                                            ]
                        },
                                                ]},
                        options: {
                            responsive: false,
                            title:{
                                display:true,
                                text: 'Recall-Percentile 99 (millis) tradeoff - down and to the right is better'
                            },
                            scales: {
                                xAxes: [{
                                    display: true,
                                    type: 'linear',
                                    max: '1',
                                    position: 'bottom',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Recall   '
                                    }
                                }],
                                yAxes: [{
                                    display: true,
                                    type: 'logarithmic',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Percentile 99 (millis) '
                                    }
                                }]
                            }
                        }
                    });
                function pushOrConcat(base, toPush) {
                        if (toPush) {
                                if (Chart.helpers.isArray(toPush)) {
                                        // base = base.concat(toPush);
                                        Array.prototype.push.apply(base, toPush);
                                } else {
                                        base.push(toPush);
                                }
                        }

                        return base;
                }
                Chart.Tooltip.prototype.getFooter = function(tooltipItem, data) {
                    var me = this;
                    var callbacks = me._options.callbacks;
                    var item = tooltipItem[0];

                    var beforeFooter = callbacks.beforeFooter.apply(me, arguments);
                    var footer = "Parameters: " + data.datasets[item.datasetIndex].data[item.index].label || '';
                    var afterFooter = callbacks.afterFooter.apply(me, arguments);

                    var lines = [];
                    lines = pushOrConcat(lines, beforeFooter);
                    lines = pushOrConcat(lines, footer);
                    lines = pushOrConcat(lines, afterFooter);

                    return lines;
                }

                </script>
            </div>
            
                                    <h3>Recall/Percentile 99.9 (millis)</h3>
            <div id="RecallPercentile 99.9 (millis)">
            <canvas id="chartRecallPercentile 99.9 (millis)" width="800" height="600"></canvas>
            <script>
                var ctx = document.getElementById("chartRecallPercentile 99.9 (millis)");
                var chart = new Chart(ctx, {
                                        type: "line",
                                        data: { datasets: [
                                                {
                            label: "sift-128-euclidean (k = 10)",
                            fill: false,
                            pointStyle: "rect",
                            borderColor: "rgba(229, 102, 102, 1)",
                            data: [
                                                                    { x: 1.0 , y: 3.904232978820802, label: "OpenGaussHnswVector(m=16, ef_construction=200, hnsw_ef_search=80)" },
                                                            ]
                        },
                                                ]},
                        options: {
                            responsive: false,
                            title:{
                                display:true,
                                text: 'Recall-Percentile 99.9 (millis) tradeoff - down and to the right is better'
                            },
                            scales: {
                                xAxes: [{
                                    display: true,
                                    type: 'linear',
                                    max: '1',
                                    position: 'bottom',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Recall   '
                                    }
                                }],
                                yAxes: [{
                                    display: true,
                                    type: 'logarithmic',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Percentile 99.9 (millis) '
                                    }
                                }]
                            }
                        }
                    });
                function pushOrConcat(base, toPush) {
                        if (toPush) {
                                if (Chart.helpers.isArray(toPush)) {
                                        // base = base.concat(toPush);
                                        Array.prototype.push.apply(base, toPush);
                                } else {
                                        base.push(toPush);
                                }
                        }

                        return base;
                }
                Chart.Tooltip.prototype.getFooter = function(tooltipItem, data) {
                    var me = this;
                    var callbacks = me._options.callbacks;
                    var item = tooltipItem[0];

                    var beforeFooter = callbacks.beforeFooter.apply(me, arguments);
                    var footer = "Parameters: " + data.datasets[item.datasetIndex].data[item.index].label || '';
                    var afterFooter = callbacks.afterFooter.apply(me, arguments);

                    var lines = [];
                    lines = pushOrConcat(lines, beforeFooter);
                    lines = pushOrConcat(lines, footer);
                    lines = pushOrConcat(lines, afterFooter);

                    return lines;
                }

                </script>
            </div>
            
                        <hr />
                                            <hr />
        
            <div id="contact">
            <h2>Contact</h2>
            <p>ANN-Benchmarks has been developed by Martin Aumueller (maau@itu.dk), Erik Bernhardsson (mail@erikbern.com), and Alec Faitfull (alef@itu.dk). Please use
            <a href="https://github.com/erikbern/ann-benchmarks/">Github</a> to submit your implementation or improvements.</p>
            </div>
        </div>
    </body>
</html>